// var n;
// var $pPSDK_Config = require("./AL_Framework_AL_SDK_CONFIG");
// var $macros = require("./AL_Framework_Macros");
// var $fitScale = require("./AL_Framework_Fit_Scale");
// var d = cc._decorator;
// var u = d.ccclass;
// var h = d.property;
// var p = (function (e) {
//     function t() {
//         var t = (null !== e && e.apply(this, arguments)) || this;
//         t.toastLabel = null;
//         t.nodeScale = 1;
//         return t;
//     }
//     __extends(t, e);
//     t.prototype.onLoad = function () {
//         this.node.addComponent($fitScale.default).shezhiShifouShiyingKuanGao(!0, !1);
//         this.nodeScale = this.node.scale;
//     };
//     t.prototype.show = function (e, t) {
//         this.toastLabel.string = e;
//         this.node.opacity = 255;
//         this.node.scale = 0;
//         var o = this.node.parent.convertToNodeSpaceAR(cc.v2(cc.winSize.width / 2, cc.winSize.height / 2));
//         this.node.y = o.y - 50;
//         this.toastLabel.node.color = cc.Color.WHITE;
//         this.node.stopAllActions();
//         cc.tween(this.node)
//             .to(
//                 0.2,
//                 {
//                     scale: this.nodeScale
//                 },
//                 {
//                     easing: "backOut"
//                 }
//             )
//             .call(function () {})
//             .delay(0.6)
//             .parallel(
//                 cc.tween().by(0.2, {
//                     position: cc.v3(0, 40, 0)
//                 }),
//                 cc.tween().to(0.2, {
//                     opacity: 0
//                 })
//             )
//             .call(function () {
//                 t();
//             })
//             .start();
//     };
//     __decorate([h(cc.Label)], t.prototype, "toastLabel", void 0);
//     return __decorate([u], t);
// })(cc.Component);
// var g = (function () {
//     function e() {
//         this.logTag = "[AL_Framework_Tips]";
//         this._prefab = null;
//     }
//     e.Instance = function () {
//         return this._instance || (this._instance = new e());
//     };
//     e.prototype.jiazai_yuzhiti = function () {
//         var e = this;
//         return new Promise(function (t, o) {
//             var i = "HUA/framework/common/components/tips/tips";
//             Manager.cacheManager.yibuHuoquHuancun(i, cc.Prefab, $macros.Macro.BUNDLE_RESOURCES).then(function (n) {
//                 n
//                     ? (Manager.assetManager.addPersistAsset(i, n, $macros.Macro.BUNDLE_RESOURCES),
//                       e.shezhi_yuzhiti(n, p),
//                       t(n))
//                     : (Log.e(e.logTag, "AL_Framework_Tips 预制体加载失败:" + i), o());
//             });
//         });
//     };
//     e.prototype.shezhi_yuzhiti = function (e, t) {
//         this._huoqu_yuzhiti_xinxi(e).getComponent(t)
//             ? ((this._type = t), (this._prefab = e))
//             : Log.e(this.logTag, "未挂载" + t.prototype.constructor.name + ",将无法使用，请排查");
//     };
//     e.prototype.init = function () {
//         return $pPSDK_Config.Config.USE_SYS_TIPS ? this.jiazai_yuzhiti() : Promise.resolve();
//     };
//     e.prototype.show = function (e) {
//         if (e) {
//             this._xianshi(e);
//         }
//     };
//     e.prototype._xianshi = function (e) {
//         if (this._prefab) {
//             var t = Manager.nodePoolManager.huoqu_pool("sys_tips", !0, this._prefab);
//             var o = t.get();
//             var i = o.getComponent(this._type);
//             cc.director.getScene().addChild(o);
//             o.zIndex = 1100;
//             i.show(e, function () {
//                 t.put(o);
//             });
//         } else {
//             Log.e(this.logTag, "未加载系统Tips组件,msg:" + e);
//         }
//     };
//     e.prototype._huoqu_yuzhiti_xinxi = function (e) {
//         return e instanceof cc.Prefab ? e.data : e;
//     };
//     e._instance = null;
//     return e;
// })();
// exports.default = g;


const AL_Framework_AL_SDK_CONFIG = require("./AL_Framework_AL_SDK_CONFIG");
const AL_Framework_Macros = require("./AL_Framework_Macros");
const AL_Framework_Fit_Scale = require("./AL_Framework_Fit_Scale");
const { ccclass, property } = cc._decorator;

/**
 * 提示框类
 */
@ccclass
class Toast extends cc.Component {
    /** @type {cc.Label} 提示框显示的文字标签 */
    @property(cc.Label)
    toastLabel = null;

    /** @type {number} 节点缩放比例 */
    nodeScale = 1;

    onLoad() {
        this.node.addComponent(AL_Framework_Fit_Scale.default).shezhiShifouShiyingKuanGao(true, false);
        this.nodeScale = this.node.scale;
    }

    /**
     * 显示提示框
     * @param {string} message 要显示的信息
     * @param {Function} callback 动画结束后的回调函数
     */
    show(message, callback) {
        this.toastLabel.string = message;
        this.node.opacity = 255;
        this.node.scale = 0;
        const position = this.node.parent.convertToNodeSpaceAR(cc.v2(cc.winSize.width / 2, cc.winSize.height / 2));
        this.node.y = position.y - 50;
        this.toastLabel.node.color = cc.Color.WHITE;
        this.node.stopAllActions();

        cc.tween(this.node)
            .to(0.2, { scale: this.nodeScale }, { easing: "backOut" })
            .call(() => {})
            .delay(0.6)
            .parallel(
                cc.tween().by(0.2, { position: cc.v3(0, 40, 0) }),
                cc.tween().to(0.2, { opacity: 0 })
            )
            .call(() => {
                callback();
            })
            .start();
    }
}

/**
 * 提示框管理类
 */
class TipsManager {
    constructor() {
        this.logTag = "[AL_Framework_Tips]";
        this._prefab = null;
    }

    /**
     * 获取 TipsManager 的单例实例
     * @returns {TipsManager} 单例实例
     */
    static Instance() {
        if (!this._instance) {
            this._instance = new TipsManager();
        }
        return this._instance;
    }

    /**
     * 异步加载提示框预制体
     * @returns {Promise<cc.Prefab>} 加载完成的预制体
     */
    jiazai_yuzhiti() {
        const path = "HUA/framework/common/components/tips/tips";
        return new Promise((resolve, reject) => {
            Manager.cacheManager.yibuHuoquHuancun(path, cc.Prefab, AL_Framework_Macros.Macro.BUNDLE_RESOURCES).then(prefab => {
                if (prefab) {
                    Manager.assetManager.addPersistAsset(path, prefab, AL_Framework_Macros.Macro.BUNDLE_RESOURCES);
                    this.shezhi_yuzhiti(prefab, Toast);
                    resolve(prefab);
                } else {
                    Log.e(this.logTag, `AL_Framework_Tips 预制体加载失败: ${path}`);
                    reject();
                }
            });
        });
    }

    /**
     * 设置提示框预制体
     * @param {cc.Prefab} prefab 提示框预制体
     * @param {Function} type 预制体绑定的组件类
     */
    shezhi_yuzhiti(prefab, type) {
        if (this._huoqu_yuzhiti_xinxi(prefab).getComponent(type)) {
            this._type = type;
            this._prefab = prefab;
        } else {
            Log.e(this.logTag, `未挂载${type.prototype.constructor.name},将无法使用，请排查`);
        }
    }

    /**
     * 初始化提示框管理
     * @returns {Promise<void>} 初始化完成
     */
    init() {
        return AL_Framework_AL_SDK_CONFIG.Config.USE_SYS_TIPS ? this.jiazai_yuzhiti() : Promise.resolve();
    }

    /**
     * 显示提示框
     * @param {string} message 要显示的信息
     */
    show(message) {
        if (message) {
            this._xianshi(message);
        }
    }

    /**
     * 显示提示框（内部使用）
     * @param {string} message 要显示的信息
     */
    _xianshi(message) {
        if (this._prefab) {
            const pool = Manager.nodePoolManager.huoqu_pool("sys_tips", true, this._prefab);
            const node = pool.get();
            const component = node.getComponent(this._type);
            cc.director.getScene().addChild(node);
            node.zIndex = 1100;
            component.show(message, () => {
                pool.put(node);
            });
        } else {
            Log.e(this.logTag, `未加载系统Tips组件, msg: ${message}`);
        }
    }

    /**
     * 获取预制体信息
     * @param {cc.Prefab} prefab 预制体
     * @returns {cc.Node} 预制体根节点
     */
    _huoqu_yuzhiti_xinxi(prefab) {
        return prefab instanceof cc.Prefab ? prefab.data : prefab;
    }
}

TipsManager._instance = null;

exports.default = TipsManager;
